home *** CD-ROM | disk | FTP | other *** search
/ D.I.S.C. 4 / D.I.S.C. 4.adf / sources / codemfm.s < prev   
Text File  |  1988-01-19  |  3KB  |  119 lines

  1. ;­Code-MFM
  2. ;­By duke/L4 for DISC #4
  3.  
  4.         jmp    Start
  5.         org    $45000
  6.         load    $45000
  7. S:
  8. Start:
  9. code_track:
  10.     movem.l    d0-d7/a0-a5,-(a7)
  11.     lea    s(pc),a5
  12.     move.l    datapt(pc),a0
  13.     lea    trackbuff(pc),a1
  14.     move.l    #$55555555,d5    ;mask for even bits
  15.     move.w    #11,d7        ;code 11 sectors
  16.     clr.w    d6        ;sector-nummer
  17. code_loop:
  18.     lea    8(a1),a2
  19.     move.l    a1,a3
  20.     move.l    #$ff000000,d0    ;format-sign
  21.     moveq    #0,d1
  22.     move.w    track(pc),d1
  23.     swap    d1
  24.     or.l    d1,d0        ;store track-nummer (0-159)
  25.     move.w    d6,d1
  26.     asl.w    #8,d1
  27.     or.w    d1,d0        ;store sector-nummer (0-10)
  28.     or.w    d7,d0        ;store no. of sectors until gap (11-1)
  29.  
  30.     clr.l    (a1)+        ;store coded zeros
  31.     move.l    #$44894489,(a1)+;syncs
  32.     bsr.l    code_long    ;code infoblock
  33.     move.l    d0,(a1)+    ;info (odd)
  34.     move.l    d1,(a1)+    ;info (even)
  35.  
  36.     move.w    #8-1,d2        
  37. store_label:
  38.     clr.l    (a1)+        ;store sector-label-field
  39.     dbf    d2,store_label    
  40.  
  41.     moveq    #0,d0
  42.     move.w    #10-1,d2    ;checksum over 40 bytes
  43. header_check:
  44.     move.l    (a2)+,d1
  45.     eor.l    d1,d0
  46.     dbf    d2,header_check
  47.     bsr.l    code_long    ;code header-checksum
  48.     move.l    d0,(a1)+    ;store headercheck (odd)
  49.     move.l    d1,(a1)+    ;store headercheck (even)
  50.  
  51.     lea    16(a2),a2    ;buffer for odd data-bits
  52.     lea    512(a2),a4    ;buffer for even data-bits
  53.     move.w    #128-1,d2
  54. code_data:
  55.     move.l    (a0)+,d0
  56.     bsr.l    code_long
  57.     move.l    d0,(a2)+    ;store odd bits
  58.     move.l    d1,(a4)+    ;store even bits
  59.     dbf    d2,code_data
  60.  
  61.     lea    8(a1),a2    ;skip space for data-checksum
  62.     moveq    #0,d0        ;clear checksum
  63.     move.w    #256-1,d2
  64. data_check:
  65.     move.l    (a2)+,d1
  66.     eor.l    d1,d0        ;calc sum
  67.     dbf    d2,data_check
  68.     bsr.l    code_long    ;code data-checksum
  69.     move.l    d0,(a1)+
  70.     move.l    d1,(a1)+
  71.  
  72.     clr.w    d4        ;set tact-bits for infoblock
  73.     bsr.l    settacts
  74.  
  75.     lea    4(a3),a3    ;skip syncs
  76.     move.w    #270-1,d4    ;set tact-bits for 270 longwords
  77.     bsr.l    settacts
  78. ;­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­
  79.     adda.w    #1024,a1    ;skip coded data-bits
  80.     addq.w    #1,d6
  81.     subq.w    #1,d7
  82.     bne.l    code_loop    ;code next sector
  83.     addi.l    #$1600,datapt-s(a5)
  84.     movem.l    (a7)+,d0-d7/a0-a5
  85.     Rts
  86.  
  87. settacts:
  88.     move.b    -1(a3),d3    ;byte from longword before
  89.     not.b    d3        ;invert byte
  90.     andi.l    #1,d3        ;mask bit 0
  91.     ror.l    #1,d3        ;shift bit 0 to bit 31
  92.     move.l    (a3),d0        ;fetch longword
  93.     move.l    d0,d1
  94.     eor.l    d5,d0
  95.     move.l    d0,d2
  96.     lsl.l    #1,d0
  97.     lsr.l    #1,d2        
  98.     or.l    d3,d2        ;set bit 31 if necessary
  99.     and.l    d2,d0
  100.     or.l    d1,d0
  101.     move.l    d0,(a3)+
  102.     dbf    d4,settacts
  103.     Rts
  104.  
  105. code_long:            ;code longword
  106.     move.l    d0,d1
  107.     lsr.l    #1,d0
  108.     and.l    d5,d0        ;odd
  109.     and.l    d5,d1        ;even
  110.     Rts
  111.         
  112. track:    dc.w    2
  113. datapt:    dc.l    data
  114. trackgap:            ;save data from trackgap on (if there're
  115.     blk.b    800,$aa        ;any errors try bigger gap)
  116. trackbuff:
  117.     blk.b    13000,$aa
  118. data:                ;store data which you want to code here
  119.